package cn.tedu.csmall520.order.webapi.service.impl;

import cn.tedu.csmall520.cart.serivce.ICartService;
import cn.tedu.csmall520.commons.exception.CoolSharkServiceException;
import cn.tedu.csmall520.commons.pojo.order.dto.OrderAddDTO;
import cn.tedu.csmall520.commons.pojo.order.entity.Order;
import cn.tedu.csmall520.commons.pojo.stock.dto.StockReduceCountDTO;
import cn.tedu.csmall520.commons.restful.JsonPage;
import cn.tedu.csmall520.commons.restful.ResponseCode;
import cn.tedu.csmall520.order.service.IOrderService;
import cn.tedu.csmall520.order.webapi.mapper.OrderMapper;
import cn.tedu.csmall520.stock.service.IStockService;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@DubboService
@Service
@Slf4j
public class OrderServiceImpl implements IOrderService {

    @Autowired
    private OrderMapper orderMapper;

    //DubboReference注解表示当前业务逻辑，需要调用其他业务逻辑中服务
    //注解下声明的业务逻辑接口必须注册到Nacos中
    //在调用时，Dubbo可以自动获取其中注册的业务逻辑层实现类的对象
    @DubboReference
    private IStockService stockService;
    @DubboReference

    private ICartService cartService;


    @Override
    public void addNew(OrderAddDTO orderAddDTO) {
        log.debug("开始处理新增订单的业务");
        //先减少订单中商品的库存数
        StockReduceCountDTO countDTO = new StockReduceCountDTO();
        countDTO.setCommodityCode(orderAddDTO.getCommodityCode());
        countDTO.setReduceCount(orderAddDTO.getCount());
        //调用对应方法，减少库存
        stockService.reduceCount(countDTO);

        // 还需要从购物车列表中删除对应商品
        cartService.delete(orderAddDTO.getUserId(), orderAddDTO.getCommodityCode());
//        使用随机数触发事务回滚效果，模拟抛出异常
        if(Math.random()<0.5){
            throw new CoolSharkServiceException(ResponseCode.INTERNAL_SERVER_ERROR,"发生随机异常");
        }
        Order order = new Order();
        BeanUtils.copyProperties(orderAddDTO,order);
        int i = orderMapper.addNew(order);
        if (i!=1) {
            log.debug("新增失败！！！");
        }
    }


    public JsonPage<Order> getAllOrderByPage(Integer page, Integer pagesize){
        // PageHelper框架使用分页功能的核心代码，是要在执行查询数据库的代码运行之前
        // 编写PageHelper.startPage方法，设置分页查询的条件
        //此处指定page=1就是第一页，无需再-1
        PageHelper.startPage(page, pagesize);
        List<Order> list = orderMapper.getAllOrders();

        //查询结果只包含分页数据，并不包含分页信息（页数，条数等）
        //所以要利用PageHelper框架提供的PageInfo类型来返回信息
        //
        return JsonPage.restPage(new PageInfo<>(list));


    }


}
